package practice2;


import java.util.*;

public class P8654 {

    private static int[] points = new int[1000*1000];       //points[x]=y表示x指向y，y是x的父节点

    public static int find(int a){
        if(points[a]==a){
            return a;       //指向自己,根就是自己
        }else {
            return points[a]=find(points[a]);   //指向父节点，继续递归父节点找到根节点，并将父节点更新为根节点
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m=sc.nextInt();     //m行
        int n=sc.nextInt();     //n列
        int k=sc.nextInt();     //k条数据
        for(int i=1;i<=m*n;i++){
            points[i]=i;        //默认指向自己
        }
        for(int i=0;i<k;i++){
            int a=sc.nextInt();
            int b=sc.nextInt();
            int fa=find(a);     //找到a的根
            int fb=find(b);     //找到b的根
            if(fa!=fb){
                points[fa]=fb;  //令a的根指向b的根
            }
        }//遍历后所有的相连的节点都指向同一个根节点
        Set<Integer> set=new HashSet<>();
        for(int i=1;i<=m*n;i++){
            set.add(find(i));
        }
        System.out.println(set.size());     //不同根的数量即为所求结果
    }
}
